#include "mq_connection.hpp"

using namespace xzt;

// 广播模式
// int main()
// {
//     // 1.实例化异步工作对象
//     AsyncWorker::ptr worker = std::make_shared<AsyncWorker>();
//     // 2.实例化connection对象
//     Connection::ptr conn = std::make_shared<Connection>("127.0.0.1", 8085, worker);
//     // 3.通过连接创建信道
//     Channel::ptr ch = conn->openChannel();
//     DLOG("打开信道：%s", ch->cid().c_str());
//     // 4.通过信道完成服务
//     // <1> 声明一个交换机，类型为广播类型
//     google::protobuf::Map<std::string, std::string> args;
//     ch->declareExchange("exchange1", ExchangeType::FANOUT, true, false, args);
//     // <2> 声明队列queue1和queue2
//     ch->declareQueue("queue1", true, false, false, args);
//     ch->declareQueue("queue2", true, false, false, args);
//     // <3> 绑定队列到交换机
//     ch->queueBind("exchange1", "queue1", "queue1");
//     ch->queueBind("exchange1", "queue2", "news.music.#");
//     // 5.发布消息
//     for(int i = 0; i < 10; i++)
//     {
//         ch->basicPublish("exchange1", nullptr, "hello world-" + std::to_string(i));
//     }
//     // 6.关闭信道
//     conn->closeChannel(ch);

//     return 0;
// }

// 直连模式
// int main()
// {
//     // 1.实例化异步工作对象
//     AsyncWorker::ptr worker = std::make_shared<AsyncWorker>();
//     // 2.实例化connection对象
//     Connection::ptr conn = std::make_shared<Connection>("127.0.0.1", 8085, worker);
//     // 3.通过连接创建信道
//     Channel::ptr ch = conn->openChannel();
//     DLOG("打开信道：%s", ch->cid().c_str());
//     // 4.通过信道完成服务
//     // <1> 声明一个交换机，类型为广播类型
//     google::protobuf::Map<std::string, std::string> args;
//     ch->declareExchange("exchange1", ExchangeType::DIRECT, true, false, args);
//     // <2> 声明队列queue1和queue2
//     ch->declareQueue("queue1", true, false, false, args);
//     ch->declareQueue("queue2", true, false, false, args);
//     // <3> 绑定队列到交换机
//     ch->queueBind("exchange1", "queue1", "queue1");
//     ch->queueBind("exchange1", "queue2", "news.music.#");
//     // 5.发布消息
//     for(int i = 0; i < 10; i++)
//     {
//         BasicPropeties props;
//         props.set_id(UUIDHelper::uuid());
//         props.set_routing_key("queue1");
//         props.set_delivery_mode(DeliveryMode::DURABLE);
//         ch->basicPublish("exchange1", &props, "hello world-" + std::to_string(i));
//     }
//     // 6.关闭信道
//     conn->closeChannel(ch);

//     return 0;
// }

// 主题交换模式
int main()
{
    // 1.实例化异步工作对象
    AsyncWorker::ptr worker = std::make_shared<AsyncWorker>();
    // 2.实例化connection对象
    Connection::ptr conn = std::make_shared<Connection>("127.0.0.1", 8085, worker);
    // 3.通过连接创建信道
    Channel::ptr ch = conn->openChannel();
    DLOG("打开信道：%s", ch->cid().c_str());
    // 4.通过信道完成服务
    // <1> 声明一个交换机，类型为广播类型
    google::protobuf::Map<std::string, std::string> args;
    ch->declareExchange("exchange1", ExchangeType::TOPIC, true, false, args);
    // <2> 声明队列queue1和queue2
    ch->declareQueue("queue1", true, false, false, args);
    ch->declareQueue("queue2", true, false, false, args);
    // <3> 绑定队列到交换机
    ch->queueBind("exchange1", "queue1", "news.#");
    ch->queueBind("exchange1", "queue2", "news.music.#");
    // 5.发布消息
    for(int i = 0; i < 10; i++)
    {
        BasicPropeties props;
        props.set_id(UUIDHelper::uuid());
        props.set_routing_key("news.music.rock");
        props.set_delivery_mode(DeliveryMode::DURABLE);
        ch->basicPublish("exchange1", &props, "hello world-" + std::to_string(i));
    }
    // 6.关闭信道
    conn->closeChannel(ch);

    return 0;
}



